const int servoPin = 23;  // 舵机信号线连接到GPIO13
int angle = 0;            // 当前角度

// 将角度(0-180)转换为脉冲宽度(500-2500微秒)
int angleToPulseWidth(int angle) {
  return (angle * 2000 / 180) + 500;  // 映射0-180度到500-2500微秒
}

void setup() {
  pinMode(servoPin, OUTPUT);  // 设置舵机控制引脚为输出模式
  Serial.begin(115200);       // 初始化串口通信
}

void loop() {
  // 从0度到180度
  for (angle = 0; angle <= 180; angle += 1) {
    controlServo(angle);      // 控制舵机转动到指定角度
    delay(15);                // 等待舵机转动到指定位置
  }
  
  // 从180度到0度
  for (angle = 180; angle >= 0; angle -= 1) {
    controlServo(angle);
    delay(15);
  }
  
  delay(1000);  // 循环间隔
}

// 控制舵机转动到指定角度
void controlServo(int angle) {
  int pulseWidth = angleToPulseWidth(angle);  // 计算对应角度的脉冲宽度
  
  // 产生PWM信号
  for (int i = 0; i < 50; i++) {  // 发送50个脉冲，约等于1秒(50Hz)
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(servoPin, LOW);
    delayMicroseconds(20000 - pulseWidth);  // 20ms周期减去高电平时间
  }
}